package br.com.sgc.session;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import br.com.sgc.dao.PessoaFisicaDao;
import br.com.sgc.entities.geral.Clinica;
import br.com.sgc.entities.geral.Endereco;
import br.com.sgc.entities.geral.Pessoa;
import br.com.sgc.entities.geral.PessoaFisica;
import br.com.sgc.entities.geral.Telefone;
import br.com.sgc.entities.medico.Medico;
import br.com.sgc.entities.rh.Cargo;
import br.com.sgc.entities.rh.Funcao;
import br.com.sgc.entities.seguranca.Perfil;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.helper.ValidadorCNPJCPFUtil;

import com.encripta.EncriptaSenha;

@Stateless
public class MedicoSession extends GenericSession<Medico> {

	private static final long serialVersionUID = -7030878575204519929L;
	
	@EJB private PessoaFisicaDao pessoaFisicaDao;
	@EJB private EnderecoSession enderecoSession;
	@EJB private TelefoneSession telefoneSession;
	@EJB private GenericSession<Cargo> cargoSession;
	@EJB private GenericSession<Funcao> funcaoSession;
	@EJB private DiaAtendimentoSession diaAtendimentoSession;
	@EJB private GenericSession<Clinica> clinicaSession;
	@EJB private GenericSession<Perfil> perfilSession;
	
	public void fillMedico(Medico medico, List<Endereco> enderecos, List<Telefone> telefones, Clinica clinica, Perfil perfil, List<Integer> dias) throws ValidacaoException{
		medico.setEnderecos(enderecoSession.prepareDependecies(enderecos,medico));
		medico.setTelefones(telefoneSession.prepareDependecies(telefones,medico));
		medico.setCargo(cargoSession.findById(Cargo.class, medico.getCargo().getId()));
		medico.setFuncao(funcaoSession.findById(Funcao.class, medico.getFuncao().getId()));
		medico.getUsuario().setClinica(clinicaSession.findById(Clinica.class, clinica.getId()));
		medico.getUsuario().setPerfilUsuario(perfilSession.findById(Perfil.class, perfil.getId()));
		medico.getUsuario().setSuperUsuario(false);
		medico.getUsuario().setSenha(EncriptaSenha.criptografa(medico.getUsuario().getSenha()));
		medico.setClinica(medico.getUsuario().getClinica());
		medico.setDiasAtendimento(diaAtendimentoSession.createDiasAtendimento(dias, medico));
	}
	
	public Medico save(Medico medico) throws ValidacaoException {
		
		return super.save(medico);
	}
	
	public Medico findByCPF(String documento, Long idClinica){
		Pessoa pessoaDB = null;
		Medico medico = new Medico();
		pessoaDB = pessoaFisicaDao.checkDocumentoPF(documento, idClinica);
		if(pessoaDB == null){
			pessoaDB = new Medico();
			medico.setCpf(documento);
		} else {
			PessoaFisica pf = (PessoaFisica) pessoaFisicaDao.findById(PessoaFisica.class, pessoaDB.getId(), true);
			medico.setCpf(pf.getCpf());
			medico.setDataNascimento(pf.getDataNascimento());
			medico.setId(pf.getId());
			medico.setAtivo(pf.getAtivo());
			medico.setEnderecos(enderecoSession.getEnderecosPersistent(pf.getEnderecos()));
			medico.setTelefones(telefoneSession.getTelefonesPersistent(pf.getTelefones()));
			medico.setNome(pf.getNome());
			medico.setRg(pf.getRg());
			medico.setSexo(pf.getSexo());
			
		}
		
		return medico;
	}
	
	public void validarCPF(String cpf) throws ValidacaoException {
		String erro = "";
		if (cpf == null || cpf.trim().equals("")) {
			erro +="Campo CPF precisa ser preenchido! <br />";
		} else if (!ValidadorCNPJCPFUtil.isCPFValido(cpf)) {
			erro +="O CPF informado � inv�lido! <br />";
		}
		if (erro != "") {
			throw new ValidacaoException(erro);
		}
	}
	
	
	@Override
	public void validarInsert(Medico t) throws ValidacaoException {
		String erro = "";
		if (t.getCpf() == null || t.getCpf().trim().equals("")) {
			erro +="Campo CPF precisa ser preenchido! ";
		} else if (!ValidadorCNPJCPFUtil.isCPFValido(t.getCpf())) {
			erro +="O CPF informado � inv�lido! ";
		} else {
			PessoaFisica pessoa = (PessoaFisica) findByCPF(t.getCpf(), t.getClinica().getId());
			if (pessoa.getId() != null && (t.getId() == null || t.getId() != null && t.getId() != pessoa.getId())) {
				erro +="J� existe uma pessoa cadastrada com esse CPF! ";
			}
		}
		if(t.getNome().isEmpty()){
			erro +="Campo Nome precisa ser Preenchido! ";
		}
		if(t.getDataNascimento() == null){
			erro +="Campo Data de Nascimento precisa ser Preenchido! ";
		}
		if(t.getEnderecos().isEmpty()){
			erro +="� necess�rio que exista pelo menos um Endere�o adicionado! ";
		}
		if(t.getSexo() == null){
			erro +="Campo Sexo precisa ser Selecionado! ";
		}
		if(t.getTelefones().isEmpty()){
			erro +="� necessario que exista pelo menos um Telefone adicionado!";
		}
		
		if(t.getPlanosSaude() == null || t.getPlanosSaude().isEmpty()){
			t.setPlanosSaude(null);
		}
		
		if(!erro.isEmpty()){
			throw new ValidacaoException(erro);
		}
	}

		
}
